package es.uma.scgt.modelo;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table (name = "usuario")
public class Usuario implements Serializable {

	private static final long serialVersionUID = 3840255817226736784L;
	
	// Atributos
	@Id
	@GeneratedValue
	@Column(name = "id")
	private Integer id;
	
	@NotNull
	@Size(max = 20)
	@Column(name = "nombre")
	private String nombre;
	
	public Integer getActive() {
		return active;
	}

	public void setActive(Integer active) {
		this.active = active;
	}

	@NotNull
	@Size(max = 20)
	@Column(name = "apellido1")
	private String apellido1;
	

	@Size(max = 20)
	@Column(name = "apellido2")
	private String apellido2;
	
	@NotNull
	@Size(max = 20)
	@Column(name = "email")
	private String email;
	
	@NotNull
	@Size(max = 20)
	@Column(name = "contrasena")
	private String password;
	
	@OneToOne(fetch = FetchType.EAGER)
	private Rol rol;
	
	@NotNull
	@Size(max = 1)
	@Column(name = "active", columnDefinition="int default 1")
	private Integer active;
	
	@ManyToMany(fetch = FetchType.EAGER, mappedBy = "usuarios", cascade = CascadeType.ALL)
	private List<Equipo> equipo;
	
	//Hibernate, necesario para la conexion con la BD LAZY
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "emisor")
	private List<Peticion> peticiones;
	
	
	
	
	//Para la conexion con la BD LAZY
	//@OneToMany(fetch = FetchType.LAZY, mappedBy = "usuario")
	@Transient
	private List<Tarea> tareas;
	
	//Para la conexion con la BD LAZY
	//@OneToMany(fetch = FetchType.LAZY, mappedBy = "usuario")
	@Transient
	private List<Nota> notas;
	
	//Lazy Usuario Modificador
	//@OneToMany(fetch = FetchType.LAZY, mappedBy = "usuarioModificacion")
	@Transient
	private List<Historico> historico_modif;
	
	//Lazy Usuario Modificado
	
	//@OneToMany(fetch = FetchType.LAZY, mappedBy = "usuario")
	@Transient
	private List<Historico> historico;

	public Usuario(String nombre, String apellido1, String apellido2,
			String email) {
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;
		this.email = email;
	}

	public Usuario() {
		// TODO Auto-generated constructor stub
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido1() {
		return apellido1;
	}

	public void setApellido1(String apellido1) {
		this.apellido1 = apellido1;
	}

	public String getApellido2() {
		return apellido2;
	}

	public void setApellido2(String apellido2) {
		this.apellido2 = apellido2;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Rol getRol() {
		return rol;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @return the equipo
	 */
	public List<Equipo> getEquipo() {
		return equipo;
	}

	/**
	 * @param equipo the equipo to set
	 */
	public void setEquipo(List<Equipo> equipo) {
		this.equipo = equipo;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((apellido1 == null) ? 0 : apellido1.hashCode());
		result = prime * result
				+ ((apellido2 == null) ? 0 : apellido2.hashCode());
		result = prime * result + ((email == null) ? 0 : email.hashCode());
		result = prime * result + ((equipo == null) ? 0 : equipo.hashCode());
		result = prime * result
				+ ((historico == null) ? 0 : historico.hashCode());
		result = prime * result
				+ ((historico_modif == null) ? 0 : historico_modif.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
		result = prime * result + ((notas == null) ? 0 : notas.hashCode());
		result = prime * result
				+ ((password == null) ? 0 : password.hashCode());
		result = prime * result
				+ ((peticiones == null) ? 0 : peticiones.hashCode());
		result = prime * result + ((rol == null) ? 0 : rol.hashCode());
		result = prime * result + ((tareas == null) ? 0 : tareas.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (apellido1 == null) {
			if (other.apellido1 != null)
				return false;
		} else if (!apellido1.equals(other.apellido1))
			return false;
		if (apellido2 == null) {
			if (other.apellido2 != null)
				return false;
		} else if (!apellido2.equals(other.apellido2))
			return false;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		if (equipo == null) {
			if (other.equipo != null)
				return false;
		} else if (!equipo.equals(other.equipo))
			return false;
		if (historico == null) {
			if (other.historico != null)
				return false;
		} else if (!historico.equals(other.historico))
			return false;
		if (historico_modif == null) {
			if (other.historico_modif != null)
				return false;
		} else if (!historico_modif.equals(other.historico_modif))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		} else if (!nombre.equals(other.nombre))
			return false;
		if (notas == null) {
			if (other.notas != null)
				return false;
		} else if (!notas.equals(other.notas))
			return false;
		if (password == null) {
			if (other.password != null)
				return false;
		} else if (!password.equals(other.password))
			return false;
		if (peticiones == null) {
			if (other.peticiones != null)
				return false;
		} else if (!peticiones.equals(other.peticiones))
			return false;
		if (rol == null) {
			if (other.rol != null)
				return false;
		} else if (!rol.equals(other.rol))
			return false;
		if (tareas == null) {
			if (other.tareas != null)
				return false;
		} else if (!tareas.equals(other.tareas))
			return false;
		return true;
	}

	
	
}
